/* eslint-disable no-unused-vars */
//登录注册模块的仓库
import { reqGetCode, reqUserRegister, reqUserLogin, reqUserInfo, reqLogout } from '@/api/index'  //引入api中的封装的接口
//引入封装token函数
import { setToken, getToken, removeToken } from '@/utils/token';
const state = {
    code: '',//默认的code空字符串
    token: getToken(),
    //localStorage.getItem('TOKEN'),//本来是默认的token空字符串''，
    //但是现在换成这个，当本地没有token时，token为null，与原来一样，当页面刷新时重新赋值就会从本地储存中获取，解决了一刷新就没有用户信息的问题
    user: {}  //默认的用户信息空对象
};
const mutations = {
    //修改state的值  验证码的code值
    GETCODE(state, code) {
        state.code = code
    },
    //登录成功时token值
    USERLOGIN(state, token) {
        state.token = token
    },
    //提交用户登录时的信息
    GETUSERINFO(state, user) {
        state.user = user
    },
    //用户退出登录时清除数据
    USERLOGOUT(state) {
        //把仓库中相关用户信息清空
        state.code = '';
        state.user = {};
        //把本地储存清空
        // localStorage.removeItem("TOKEN") 清除token
        removeToken()
    }
};
const actions = {//被派发的函数，
    //获取验证码，后台的接口，直接把验证码返回，正常情况下是发送到用户手机上
    async getCode({ commit }, phone) {
        let result = await reqGetCode(phone)
        // console.log(result)
        if (result.code == 200) {
            commit("GETCODE", result.data)
            return 'ok' //成功返回ok
        } else {
            return Promise.reject(new Error("faile"))
        }
    },
    //用户注册的函数
    async userRegister({ commit }, user) {
        let result = await reqUserRegister(user)
        // console.log(result)  也可以不用传整个结果,直接传code值但是前台就需要自己书写错误信息
        if (result.code == 200) {
            return result
            // } else if (result.code == 223) {
            //     return result
            // } else if (result.code == 206) {
            //     return result
        } else {
            // console.log(result.message)
            return Promise.reject(new Error(result.message))  //直接显示错误信息
        }

    },
    //用户登录
    async userLogin({ commit }, data) {
        let result = await reqUserLogin(data)
        // console.log(result)
        /**服务器下发token，用户唯一标识符[与UUID类似]
         * 将来警察那个通过带token找服务器要用户信息进行展示
         */
        if (result.code == 200) {
            //用户已经登录成功且获取到了token
            commit('USERLOGIN', result.data.token) //提交token到vuex
            //持久化存储token 本地储存
            // localStorage.setItem('TOKEN', result.data.token)
            //封装之后的办法
            setToken(result.data.token)
            return 'ok'
        } else {
            return Promise.reject(new Error(result.message))
        }
    },
    //获取用户登录的信息  home组件
    async getUserInfo({ commit }) {
        let result = await reqUserInfo()
        //console.log(result)    将result的结果提交，储存
        if (result.code == 200) {
            commit("GETUSERINFO", result.data)
            return 'ok'
        } else {
            // return Promise.reject(new Error(result.message))
        }
    },
    //用户退出登录
    async userLogout({ commit }) {
        //只是向服务器发起一次请求，通知服务器清楚token
        let result = await reqLogout()
        // console.log(result)
        if (result.code == 200) {
            //只有mutation才可以修改state的值
            commit('USERLOGOUT')
            return 'ok'
        } else {
            return Promise.reject(new Error(result.message))
        }

    }
};
const getters = {};
export default {  //对外暴露
    state, mutations, actions, getters
}